Com certeza! O "Exemplo 04 do manual" refere-se à seção "Chapter 3 ·Adding windows" do Guia de Programação do Turbo Vision, que aborda os "Step 4: Adding a window" e "Step 5: Adding a clipboard window" do tutorial.
Nesta seção, você aprende a adicionar e gerenciar janelas na sua aplicação Turbo Vision. O processo envolve a interação com o objeto Desktop, que é fundamental para organizar as janelas na tela.
Aqui estão os principais pontos e passos para "Adicionar Janelas", conforme o manual:
Visão Geral:
Desktop é a chave para gerenciar janelas, rastreando-as e lidando com operações como cascata e mosaico.Três Passos para Adicionar uma Janela:
Assign em uma variável do tipo TRect para definir coordenadas absolutas, por exemplo, R.Assign(0, 0, 60, 20).New(PWindow, Init(R, 'Um título', wnNoNumber)). O construtor Init requer os limites (R), uma string para o título e um número para a janela (wnNoNumber indica que não há número). Se um número entre 1 e 9 for atribuído, o usuário pode ativar a janela pressionando Alt + o número correspondente.Insert é comum a todos os grupos do Turbo Vision e dá ao grupo controle sobre seus objetos. Ao inserir uma janela no Desktop, você instrui o Desktop a gerenciá-la. O método InsertWindow do objeto Application é uma maneira mais segura de fazer isso, pois verifica a validade da janela antes de inseri-la.Mosaico (Tiling) e Cascata (Cascading):
Desktop tem a capacidade de organizar janelas em mosaico ou cascata. O manipulador de eventos padrão em TApplication responde aos comandos cmTile e cmCascade (do menu Janela) chamando os métodos Tile e Cascade do TApplication.Adicionando uma Janela Editora (File Editor Window):
MaxHeapSize (do módulo Memory) antes de construir o objeto Application. Isso reserva uma parte da memória (acima do heap regular) para os buffers do editor de arquivos.EditorDialog (do módulo Editors) lida com todas as caixas de diálogo para objetos editor. Por padrão, ela não faz nada. Você deve atribuir a função StdEditorDialog a ela para usar as caixas de diálogo padrão do editor (por exemplo, EditorDialog := StdEditorDialog;).PEditWindow (em vez de PWindow). O construtor é similar, mas passar uma string de título vazia resultará em "Untitled" para a janela.Usando Caixas de Diálogo Padrão (Standard Dialog Boxes):
StdDlgs do Turbo Vision fornece o objeto TFileDialog para isso.ExecuteDialog (do objeto Application) não apenas insere a caixa de diálogo no Desktop, mas também a torna modal. Isso significa que a caixa de diálogo é a única parte ativa da aplicação até ser fechada.TFileDialog: O construtor da TFileDialog aceita cinco parâmetros: uma máscara inicial de nome de arquivo (ex: *.*), um título, um rótulo para a linha de entrada, flags de opção (ex: fdOKButton, fdOpenButton) e o número de uma lista de histórico.TFileDialog: ExecuteDialog retorna o valor do comando que fechou a caixa (ex: cmOK, cmCancel), permitindo que seu programa saiba se o usuário aceitou ou cancelou a ação. Ele também pode inicializar os controles da caixa de diálogo com um registro de dados e ler os valores dos controles após a execução.PEditWindow.PEditWindow da mesma forma que uma janela editora de arquivos, mas ela é inicialmente oculta usando o método Hide.Clipboard (do módulo Editors) deve ser definida para apontar para o editor dentro da janela da área de transferência (Clipboard := ClipboardWindowA.Editor;).CanUndo) da área de transferência deve ser desabilitada (ClipboardA.CanUndo := False), pois ela não suporta essa funcionalidade.cmClipShow (gerado pelo item "Show clipboard" do menu Editar), a janela da área de transferência é exibida usando ClipboardWindowA.Show.Select nela (ClipboardWindowA.Select;), antes de Show. O método Select torna o objeto a subview selecionada e, se o flag ofTopSelect estiver definido, move-o para a frente.Esses passos detalham o processo para integrar janelas e suas funcionalidades avançadas, como edição de arquivos e área de transferência, em uma aplicação Turbo Vision.
Com certeza! Continuaremos com a documentação do "Exemplo 04 do manual", focando nos exemplos de uso práticos (listagens de código) para adicionar e gerenciar janelas.
Como mencionado anteriormente, o Desktop é fundamental para gerenciar janelas múltiplas e redimensionáveis. O manual apresenta os seguintes exemplos de código para demonstrar a adição de janelas:
Adicionando uma Janela Simples de Forma Segura (Listing 3.1):
TUTOR04A.PAS, mostra como criar e inserir uma janela básica no desktop de forma segura.NewWindow da aplicação TTutorApp é redefinido para criar uma PWindow (uma janela genérica).R.Assign(0, 0, 60, 20) para um retângulo de 60 colunas por 20 linhas.New(TheWindow, Init(R, 'A window', wnNoNumber)). O parâmetro wnNoNumber indica que a janela não terá um número associado, mas se um número de 1 a 9 for atribuído, o usuário pode ativá-la com Alt + número.InsertWindow(TheWindow). O método InsertWindow da aplicação é recomendado por ser mais seguro, verificando se a janela foi construída com sucesso e se há memória suficiente.procedure TTutorApp.NewWindow;
var
R: TRect;
TheWindow: PWindow;
begin
R.Assign(0, 0, 60, 20);
New(TheWindow, Init(R, 'A window', wnNoNumber));
InsertWindow(TheWindow); { insere a janela no desktop }
end;
HandleEvent da TTutorApp é modificado para chamar NewWindow quando o comando cmNew (gerado pelo menu "File | New") é recebido.Adicionando uma Janela Editora de Arquivos (Listing 3.2):
TUTOR04B.PAS, demonstra a configuração necessária e a criação de uma janela para edição de arquivos.MaxHeapSize := 8192 (do módulo Memory). Isso reserva 128KB de memória acima do heap regular para buffers do editor de arquivos.EditorDialog (do módulo Editors) deve ser definida para StdEditorDialog (EditorDialog := StdEditorDialog;). Isso garante que as caixas de diálogo padrão do editor (como "salvar alterações") sejam usadas.NewWindow é alterado para construir uma PEditWindow (janela editora) em vez de uma PWindow. Uma string vazia para o título resulta no título "Untitled".
constructor TTutorApp.Init;
begin
MaxHeapSize := 8192; { configura a área de buffer do editor de arquivos acima do heap }
EditorDialog := StdEditorDialog; { usa diálogos do editor padrão }
inherited Init;
DisableCommands([cmOrderWin, cmStockWin, cmSupplierWin]);
end;
procedure TTutorApp.NewWindow;
var
R: TRect;
TheWindow: PEditWindow; { nota a mudança de tipo aqui }
begin
R.Assign(0, 0, 60, 20);
New(TheWindow, Init(R, '', wnNoNumber)); { constrói a janela editora }
InsertWindow(TheWindow);
end;
Abrindo um Arquivo para Edição Usando uma Caixa de Diálogo Padrão (Listing 3.3):
TUTOR04C.PAS, mostra como usar uma caixa de diálogo TFileDialog para selecionar um arquivo e abri-lo em um PEditWindow.OpenWindow é introduzido em TTutorApp e é chamado em resposta ao comando cmOpen (do menu "File | Open").TFileDialog é criada com uma máscara inicial de arquivo ('*.*'), um título ("Open file"), um rótulo para a entrada ("-F-ile name"), flags de opção (fdOKButton or fdOpenButton) e um número para a lista de histórico (1).ExecuteDialog(FileDialog, @TheFile). ExecuteDialog retorna o comando que a fechou (por exemplo, cmOK, cmCancel).<> cmCancel), uma nova PEditWindow é criada e inserida, usando o nome do arquivo selecionado (TheFile) como título.procedure TTutorApp.OpenWindow;
var
R: TRect;
FileDialog: PFileDialog;
TheFile: FNameStr;
const
FDOptions: Word = fdOKButton or fdOpenButton;
begin
TheFile := '*.*'; { máscara inicial para nomes de arquivos }
New(FileDialog, Init(TheFile, 'Open file', '-F-ile name', FDOptions, 1));
if ExecuteDialog(FileDialog, @TheFile) <> cmCancel then
begin
R.Assign(0, 0, 75, 20);
InsertWindow(New(PEditWindow, Init(R, TheFile, wnNoNumber)));
end;
end;
Este passo detalha como adicionar e gerenciar a janela da área de transferência (clipboard) na aplicação.
Criando a Janela da Área de Transferência (Listing 3.4):
PEditWindow é criada para atuar como a janela da área de transferência (ClipboardWindow).SetState(sfVisible, False)) antes de ser inserida para evitar que "pisque" na tela.Clipboard (do módulo Editors) é configurada para apontar para o editor dentro desta janela (Clipboard := ClipboardWindowA.Editor;).CanUndo) é desabilitada para o clipboard (ClipboardA.CanUndo := False).constructor TTutorApp.Init;
var R: TRect;
begin
MaxHeapSize := 8192;
EditorDialog := StdEditorDialog;
StreamError := @TutorStreamError;
RegisterObjects; RegisterViews; RegisterEditors; RegisterApp;
inherited Init;
DesktopA.GetExtent(R);
ClipboardWindow := New (PEditWindow, Init(R, '', 0));
if ValidView(ClipboardWindow) <> nil then
begin
ClipboardWindowA.SetState(sfVisible, False); { a janela é inicialmente oculta }
InsertWindow(ClipboardWindow);
Clipboard := ClipboardWindowA.Editor;
ClipboardA.CanUndo := False;
end;
end;
Mostrando a Janela da Área de Transferência na Frente (Listing 3.6):
cmClipShow (gerado pelo item "Show clipboard" do menu Editar), é necessário adicioná-la à frente das outras janelas.HandleEvent da TTutorApp é modificado para responder a cmClipShow.Select é chamado antes de Show (ClipboardWindowA.Select; ClipboardWindowA.Show;). Select torna o objeto a subview selecionada e o move para a frente, se o flag ofTopSelect estiver definido.procedure TTutorApp.HandleEvent(var Event: TEvent);
begin
// ... outro código de tratamento de eventos ...
if Event.What = evCommand then
begin
case Event.Command of
cmClipShow:
with ClipboardWindowA do
begin
Select; { move a janela para a frente }
Show; { exibe a janela }
ClearEvent(Event);
end;
// ... outros comandos ...
end;
end;
inherited HandleEvent(Event); // Chamar o inherited HandleEvent é geralmente recomendado por último
end;